package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * throws异常处理
 */
public class Throws01 {

    public static void main(String[] args) {
        /*
            如果一个方法(中的语句执行时)可能生成某种异常，但是并不能确定如何处理这些异常，则此方法应显式声明抛出异常
            表明该方法将不对这些异常进行处理，而由该方法的调用者负责处理
            在方法声明中用throws语句可以声明抛出异常的列表，throws后面的异常类型可以是方法中产生的异常类型，也可以是它的父类
         */
        /*
            1)对于编译异常，程序中必须处理，比如 try-catch 或者 throws
            2)对于运行时异常，程序中如果没有处理，默认就是 throws 的方式处理
            3)子类重写父类的方法时，对抛出异常的规定：子类重写的方法，所抛出的异常类型要么和父类抛出的异常一致，要么
              为父类抛出的异常的类型的子类型
         */

        f2();
    }

    public static void f2() {/*throwsArithmeticException*/
        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;

    }

    public static void f1() throws FileNotFoundException {
        /*
            调用f3()报错
            f3() 方法抛出的是一个编译异常
            f1() 必须处理这个编译异常 try-catch 或继续 throws
         */
        f3();//抛出异常
    }

    public static void f3() throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }

    public static void f4() {
        /*
            调用 f5() 不报错
            f5() 抛出运行异常
         */
        f5();
    }

    public static void f5() throws ArithmeticException {

    }
}

class Father { //父类
    public void method() throws RuntimeException {
    }
}
class Son extends Father {//子类
//3. 子类重写父类的方法时，对抛出异常的规定:子类重写的方法，
//所抛出的异常类型要么和父类抛出的异常一致，要么为父类抛出的异常类型的子类型
//4. 在 throws 过程中，如果有方法 try-catch, 就相当于处理异常，就可以不必throws
    @Override
    public void method() throws ArithmeticException {
    }
}